/**
 * 
 */
package ictius.menu;

import java.util.Scanner;

import ictius.demonio.Informante;
import ictius.elemenos.Lector;
import ictius.elemenos.Libro;
import ictius.elemenos.Pedido;
import ictius.elemenos.Prestamo;
import ictius.excepciones.ScannerException;
import ictius.herramientas.BuscarElemento;

/**
 * Esta clase se encarga de crear los elementos a guardar dentro de las estructuras.
 * Cada método se ocupa de un elemento en particular, por lo que se 
 * instancia a cada elemento dentro del método para tener separada la funcionalidad.
 * @author tadeo 
 */
public class CargaElemento {

    /**
     * Utiliza un objeto Scanner para realizar el ingreso de los datos <i>formateados</i> por teclado.
     */
    private Scanner seguidor = new Scanner(System.in);

    /**
     * Este método se encarga de rellenar los campos del objeto libro.
     */
    public void cargarLibro() throws ScannerException {
        Libro book = new Libro();
        System.out.println("Ingrese el título del libro: ");
        book.setTitulo(seguidor.nextLine());
        System.out.println("Ingrese la cantidad de páginas del libro: ");
        book.setPaginas(leerEnteros(seguidor));
        ControlEstructuras.almacenarLibro(book);
    }

    /**
     * Este método carga la información necesaria para un nuevo Lector.
     */
    public void cargarLector() throws ScannerException {
        Lector lectio = new Lector();
        System.out.println("Ingrese el nombre del lector: ");
        Informante.asustar("Se está creando un nuevo Lector.");
        lectio.setNombre(seguidor.nextLine());
        System.out.println("el apellido: ");
        lectio.setApellido(seguidor.nextLine());
        System.out.println("la dirección: ");
        lectio.setAddress(seguidor.nextLine());
        System.out.println("el teléfono: ");
        lectio.setTelefono(seguidor.nextLine());
        Informante.asustar("Se han cargado los datos necesarios para un nuevo Lector");
        ControlEstructuras.almacenarLector(lectio);
    }

    /**
     * Este método utiliza la búsqueda para completar el campo del Pedido en
     * libro.
     */
    public void cargarPedido() throws ScannerException {
        Pedido neces = new Pedido();
        System.out.println("Ingrese el título del libro que desea pedir: ");
        Informante.asustar("Se está buscando un Libro...");
        neces.setEncargado((Libro) BuscarElemento.buscarLibro(seguidor.nextLine()));
        if (neces.getEncargado() == null) {
            System.out.println("No se puede continuar con el registro del pedido.");
        } else {
            System.out.println("Ingrese el nombre del lector que está pidiendo un libro: ");
            neces.setPretendiente((Lector) BuscarElemento.buscarLector(seguidor.nextLine()));
            if(neces.getPretendiente() == null)
                System.out.println("No se puede continuar con el registro del pedido.");
            else{
                Informante.asustar("Se han cargado los datos para realizar el pedido.");
            ControlEstructuras.almacenarPedido(neces);
            }
            
        }

    }

    /**
     * Este método carga la información necesaria para un nuevo Prestamo. Va a
     * utilizar una búsqueda para regresar con el Lector y el Libro que se
     * quiere llevar.
     */
    public void cargarPrestamo() throws ScannerException {
        Prestamo loan = new Prestamo();
        System.out.println("Ingrese el título del libro que desea");
        Informante.asustar("Se está creando un nuevo Prestamo.");

        loan.setEsteLibro((Libro) BuscarElemento.buscarLibro(seguidor.nextLine()));
        if ((loan.getEsteLibro().isPrestado())) {
            System.out.println("El libro ha sido prestado, debe esperar a que sea devuelto.");

        } else {
            loan.getEsteLibro().setPrestado(true);
            System.out.println("ingrese el apellido del lector: ");
            loan.setUnLector((Lector) BuscarElemento.buscarLector(seguidor.nextLine()));
            if (loan.getUnLector() == null) {
                System.out.println("No se puede continuar con la operación de prestamo.");
            } else {
                System.out.println("fecha de salida: ");
                loan.setFechaSalida(seguidor.nextLine());
                System.out.println("fecha de regreso: ");
                loan.setFechaRegreso(seguidor.nextLine());
                ControlEstructuras.almacenarPrestamo(loan);
            }

        }


    }

    /**
     * Método recursivo para evitar el error de ingresar caractéres en lugar de números.
     * Se produce porque el caracter Enter y Espacio son tomados por <code>Scanner</code>.
     * @param in
     * @return entero con formato número de correcto.
     */
    private int leerEnteros(Scanner in) throws ScannerException {
        int entero = 0;
        try {
            entero = in.nextInt();
        } catch (Exception e) {
            System.out.println("Sólo se pueden ingresar números, por favor vuelva a intentarlo.");
            in.nextLine();
            entero = leerEnteros(in);
        }
        return entero;
    }
}